package org.example.netty.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

import java.util.Random;

/**
 * 说明
 * 1.我们自定义一个Handler，需要集成netty 规定好都各HandlerAdapter（规范）
 * 2.我们自定的Handler才能出成为一个Handler
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 读取数据
     * 这里我们可以读取客户端发送的消息
     *
     * @param ctx 上下文对象，可以得到管道（pipeline），通道（channel）
     * @param msg 客户端发送的数据
     *
     * @throws Exception 异常
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //super.channelRead(ctx, msg);
        System.out.println("server ctx=" + ctx);
        System.out.println("服务器读取线程" + Thread.currentThread().getName());
        if(msg instanceof StudentPOJO.Student) {
            //可以换成SimpleChannelInboundHandler来固定处理对象，就不用显示转换了
            StudentPOJO.Student stu = (StudentPOJO.Student) msg;
            System.out.println("客户端发送的数据 id=" + stu.getId() + "，名字=" + stu.getName());
        }
    }

    /**
     * 数据读取完毕
     *
     * @param ctx
     *
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //super.channelReadComplete(ctx);
        /**
         * 将数据写到缓存
         * 并刷新发出去
         * 需要编码
         */
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端~wang", CharsetUtil.UTF_8));
    }

    /**
     * 处理异常
     *
     * @param ctx
     * @param cause
     *
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //super.exceptionCaught(ctx, cause);

        /**
         * 一样的
         */
        //ctx.channel().close();
        ctx.close();
    }

}
